package com.atguigu.desaes;

import com.sun.org.apache.xml.internal.security.utils.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * DesAesDemo
 *
 * @Author: 马伟奇
 * @CreateTime: 2021-02-27
 * @Description:
 *
 * base64原理：
 * base64是3个字节为一组 ，一个字节是8位，3 * 8 = 24
 * 转换成 4 组 ，每组变成6位 4 * 6 = 24
 * 0011-1111 = 32 + 16 + 8 + 4 + 2 + 1 = 0 - 63
 *
 *
 *
 */
public class AesDemo {
    public static void main(String[] args) throws Exception{
        // 定义原文
        String input = "硅谷";
        // 定义密钥 加密规则 使用des加密的时候加密的规则必须是8个字节或者8的整数倍
        String key = "1234567812345678";
        String transformation = "AES";
        String algorithm = "AES";

        String encryptDES = encryptDES(input, key, transformation, algorithm);
        System.out.println("加密:" + encryptDES);

        String s = decryptDES(encryptDES, key, transformation, algorithm);
        System.out.println("解密:" + s);

    }

    /**
     *
     * @param encryptDES 表示密文
     * @param key 秘钥
     * @param transformation 算法
     * @param algorithm 算法
     * @return
     */
    private static String decryptDES(String encryptDES,
                                     String key,
                                     String transformation,
                                     String algorithm) throws Exception{
        Cipher cipher = Cipher.getInstance(transformation);
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        cipher.init(Cipher.DECRYPT_MODE,sks);
        byte[] bytes = cipher.doFinal(Base64.decode(encryptDES));

        return new String(bytes);
    }

    /**
     * 使用DES加密数据
     *
     * @param input          : 原文
     * @param key            : 密钥(DES,密钥的长度必须是8个字节)
     * @param transformation : 获取Cipher对象的算法
     * @param algorithm      : 获取密钥的算法
     * @return : 密文
     * @throws Exception
     */
    private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {
        // 获取加密对象
        Cipher cipher = Cipher.getInstance(transformation);
        // 创建加密规则
        // 第一个参数key的字节
        // 第二个参数表示加密算法
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        // ENCRYPT_MODE：加密模式
        // DECRYPT_MODE: 解密模式
        // 初始化加密模式和算法
        cipher.init(Cipher.ENCRYPT_MODE,sks);
        // 加密
        byte[] bytes = cipher.doFinal(input.getBytes());

        // 输出加密后的数据
        String encode = Base64.encode(bytes);

        return encode;
    }
}